package com.bjpowernode.ba02;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;

import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * @Aspect：是aspect框架的注解. 作用：表示当前类是切面类
 * 切面类：是用来给业务方法增加功能的类,在这个类有切面功能的代码
 * 位置：在类定义的上面
 */
@Aspect
public class MyAspect {
    /**
     * 后置通知定义方法,方法是实现切面功能的.
     * 方法的定义要求:
     * 1.公共方法public.
     * 2.方法没有返回值.
     * 3.方法名称自定义.
     * 4.方法可以有参数的
     */

    /**
     * @param res
     * @AfterReturning:后置通知 属性1:value 切入点表达式
     * 属性2:Returning 自定义的变量,表示目标方法的返回值
     * returning = "xxx"这个自定义变量名必须和通知方法的形参名称一样
     * 位置:在方法定义的上面
     * 特点:
     * 1.在目标方法执行后执行.
     * 2.能够获取到目标方法的返回值,可以根据这个返回值做不同的业务处理.
     * Object res = doOther();
     * 3.可以修改这个返回值.
     */
    @AfterReturning(value = "execution(* *..SomeServiceImpl.doOther(..))", returning = "res")
    private void MyAfterReturning(Object res) {
        // Object res:是目标方法执行后的返回值,根据返回值做你切面的功能处理
        System.out.println("后置通知:在目标方法后执行的,获取的返回值是:" + res);
        if (res.equals("doOther")) {
            // 做一些功能
        }
        if (!res.equals("doOther")) {
            // 做一些其它功能
        }
        // 修改目标方法的返回值,看一下是否会受影响,最后的方法调用结果
        if (res != null) {
            res = "Hello Aspectj ";
        }
    }

    @AfterReturning(value = "execution(* *..SomeServiceImpl.doStudent(..))", returning = "res")
    private void MyAfterReturning2(Object res) {
        // Object res:是目标方法执行后的返回值,根据返回值做你切面的功能处理
        System.out.println("后置通知:在目标方法后执行的,获取的返回值是:" + res);
        Student student = (Student) res;
        student.setName("李四");
        student.setAge(24);
    }

}
